package cn.ynrcb.personnelfile.common.utils;

import cn.hutool.core.io.resource.ClassPathResource;
import cn.hutool.core.io.resource.Resource;
import net.sf.jxls.exception.ParsePropertyException;
import net.sf.jxls.transformer.XLSTransformer;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


public class ExportExcel {

    public SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//	public String exportXLS(List<Record> list, String fileName){
//        // 第一步，创建一个webbook，对应一个Excel文件
//        HSSFWorkbook wb = new HSSFWorkbook();
//        // 第二步，在webbook中添加一个sheet,对应Excel文件中的sheet
//        HSSFSheet sheet = wb.createSheet("导出网评数据");
//        sheet.setDefaultColumnWidth(15);
//        // 第三步，在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short
//        HSSFRow row = sheet.createRow((int) 0);
//        // 生成一个样式
//        HSSFCellStyle style = wb.createCellStyle();
//        // 设置这些样式
//        style.setFillForegroundColor(HSSFColor.GREEN.index);
//        style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
//        style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
//        style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
//        style.setBorderRight(HSSFCellStyle.BORDER_THIN);
//        style.setBorderTop(HSSFCellStyle.BORDER_THIN);
//        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//        // 第四步，创建单元格，并设置值表头 设置表头居中
//        HSSFFont font = wb.createFont();
////        font.setColor(HSSFColor.VIOLET.index);
//        font.setFontHeightInPoints((short) 12);
//        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
//        style.setFont(font);
//
//		HSSFCell cell = row.createCell(0);
//        cell.setCellValue("用户昵称");
//        cell.setCellStyle(style);
//        cell = row.createCell(1);
//        cell.setCellValue("来源站点");
//        cell.setCellStyle(style);
//        cell = row.createCell(2);
//        cell.setCellValue("站点类型");
//        cell.setCellStyle(style);
//        cell = row.createCell(3);
//        cell.setCellValue("内 容");
//        cell.setCellStyle(style);
//        cell = row.createCell(4);
//        cell.setCellValue("阅读数");
//        cell.setCellStyle(style);
//        cell = row.createCell(5);
//        cell.setCellValue("评论数");
//        cell.setCellStyle(style);
//        cell = row.createCell(6);
//        cell.setCellValue("转发数");
//        cell.setCellStyle(style);
//        cell = row.createCell(7);
//        cell.setCellValue("点赞");
//        cell.setCellStyle(style);
//        cell = row.createCell(8);
//        cell.setCellValue("发布时间");
//        cell.setCellStyle(style);
////        cell = row.createCell(9);
////        cell.setCellValue("考核结束时间");
////        cell.setCellStyle(style);
//
//
//        for(int i=0;i<list.size();i++){
//        	row = sheet.createRow((int)i + 1);
//        	Record r = list.get(i);
//            // 第四步，创建单元格，并设置值
//        	HSSFCell cell0 = row.createCell(0);
//        	cell0.setCellType(HSSFCell.CELL_TYPE_STRING);
//        	cell0.setCellValue((String)r.get("nickname"));
//        	HSSFCell cell1 = row.createCell(1);
//        	cell1.setCellValue((String)r.get("site_name"));
//        	HSSFCell cell2 = row.createCell(2);
//        	cell2.setCellValue((String)r.get("site_type"));
//        	HSSFCell cell3 = row.createCell(3);
//        	cell3.setCellValue((String)r.get("content"));
//        	HSSFCell cell4 = row.createCell(4);
//        	cell4.setCellValue((int)r.get("read_num"));
//        	HSSFCell cell5 = row.createCell(5);
//        	cell5.setCellValue((int)r.get("repeat_num"));
//        	HSSFCell cell6 = row.createCell(6);
//        	cell6.setCellValue((int)r.get("forward_num"));
//        	HSSFCell cell7 = row.createCell(7);
//        	cell7.setCellValue((int)r.get("thumb_num"));
//        	HSSFCell cell8 = row.createCell(8);
//        	cell8.setCellValue(sdf.format((Date)r.get("publish_date")).substring(0, 19));
////        	HSSFCell cell9 = row.createCell(9);
////        	cell9.setCellValue((String)r.get("end_time"));
//        }
//
//        try {
//        	String filePath = PathKit.getWebRootPath()+"/upload/export/"+fileName;
//        	File file = new File(filePath);
//        	if(file.exists()){
//        		System.out.println("创建文件，目标文件已存在！");
//        	}
//
//            //判断目标文件所在的目录是否存在
//            if(!file.getParentFile().exists()) {
//                //如果目标文件所在的目录不存在，则创建父目录
//                System.out.println("目标文件所在目录不存在，准备创建它！");
//                if(!file.getParentFile().mkdirs()) {
//                    System.out.println("创建目标文件所在目录失败！");
//                    return null;
//                }
//            }
//
//            if (file.createNewFile()) {
//            	System.out.println("文件创建成功！");
//            }
//
//
//        	FileOutputStream fout;
//			fout = new FileOutputStream(file);
//			wb.write(fout);
//			fout.close();
//			return filePath;
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//        return "";
//	}
//
//
//	public String exportXLS1(List<Record> list, String fileName){
//        // 第一步，创建一个webbook，对应一个Excel文件
//        HSSFWorkbook wb = new HSSFWorkbook();
//        // 第二步，在webbook中添加一个sheet,对应Excel文件中的sheet
//        HSSFSheet sheet = wb.createSheet("导出网评数据");
//        sheet.setDefaultColumnWidth(15);
//        // 第三步，在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short
//        HSSFRow row = sheet.createRow((int) 0);
//        // 生成一个样式
//        HSSFCellStyle style = wb.createCellStyle();
//        // 设置这些样式
//        style.setFillForegroundColor(HSSFColor.GREEN.index);
//        style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
//        style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
//        style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
//        style.setBorderRight(HSSFCellStyle.BORDER_THIN);
//        style.setBorderTop(HSSFCellStyle.BORDER_THIN);
//        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//        // 第四步，创建单元格，并设置值表头 设置表头居中
//        HSSFFont font = wb.createFont();
////        font.setColor(HSSFColor.VIOLET.index);
//        font.setFontHeightInPoints((short) 12);
//        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
//        style.setFont(font);
//
//		HSSFCell cell = row.createCell(0);
//        cell.setCellValue("站点");
//        cell.setCellStyle(style);
//        cell = row.createCell(1);
//        cell.setCellValue("总计");
//        cell.setCellStyle(style);
//        cell = row.createCell(2);
//        cell.setCellValue("新闻");
//        cell.setCellStyle(style);
//        cell = row.createCell(3);
//        cell.setCellValue("微博");
//        cell.setCellStyle(style);
//        cell = row.createCell(4);
//        cell.setCellValue("微信");
//        cell.setCellStyle(style);
//        cell = row.createCell(5);
//        cell.setCellValue("论坛");
//        cell.setCellStyle(style);
//        cell = row.createCell(6);
//        cell.setCellValue("博客");
//        cell.setCellStyle(style);
//        cell = row.createCell(7);
//        cell.setCellValue("上报");
//        cell.setCellStyle(style);
//
//
//        for(int i=0;i<list.size();i++){
//        	row = sheet.createRow((int)i + 1);
//        	Record r = list.get(i);
//            // 第四步，创建单元格，并设置值
//        	HSSFCell cell0 = row.createCell(0);
//        	cell0.setCellType(HSSFCell.CELL_TYPE_STRING);
//        	cell0.setCellValue((String)r.get("site_name"));
//        	HSSFCell cell1 = row.createCell(1);
//        	cell1.setCellValue((long)r.get("total"));
//        	HSSFCell cell2 = row.createCell(2);
//        	cell2.setCellValue((long)r.get("xw"));
//        	HSSFCell cell3 = row.createCell(3);
//        	cell3.setCellValue((long)r.get("wb"));
//        	HSSFCell cell4 = row.createCell(4);
//        	cell4.setCellValue((long)r.get("wx"));
//        	HSSFCell cell5 = row.createCell(5);
//        	cell5.setCellValue((long)r.get("luntan"));
//        	HSSFCell cell6 = row.createCell(6);
//        	cell6.setCellValue((long)r.get("bk"));
//        	HSSFCell cell7 = row.createCell(7);
//        	cell7.setCellValue((long)r.get("sb"));
//        }
//
//        try {
//        	String filePath = PathKit.getWebRootPath()+"/upload/export/"+fileName;
//        	File file = new File(filePath);
//        	if(file.exists()){
//        		System.out.println("创建文件，目标文件已存在！");
//        	}
//
//            //判断目标文件所在的目录是否存在
//            if(!file.getParentFile().exists()) {
//                //如果目标文件所在的目录不存在，则创建父目录
//                System.out.println("目标文件所在目录不存在，准备创建它！");
//                if(!file.getParentFile().mkdirs()) {
//                    System.out.println("创建目标文件所在目录失败！");
//                    return null;
//                }
//            }
//
//            if (file.createNewFile()) {
//            	System.out.println("文件创建成功！");
//            }
//
//
//        	FileOutputStream fout;
//			fout = new FileOutputStream(file);
//			wb.write(fout);
//			fout.close();
//			return filePath;
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//        return "";
//	}
	
	/**
	 * 模板方式导出excel
	 * @author swb
	 * @version created at 2017年10月19日 下午3:39:28
	 */
	public void exportExcelByTemplate(List<Map<String, Object>> records,String templateFile, String fileName,String exportFilePath){
		String templateFilePath = "/template/"+templateFile;
		String descFilePath = exportFilePath + fileName;
		/**
		 * 这儿申明的map集合是为了后面transformXLS方法转化需要传入Excel里面的一个Map，
		 * jxls根据Template里面的定义和Map里面的对象对Template进行解析，
		 * 将Map里面的对象值填入到Excel文件中。
		 */
		Map<String, Object> dataMap = new HashMap<String, Object>();
		dataMap.put("datas", records);
		dataMap.put("date", DateUtils.getChinaeseDateYMD(new Date()));
		
		InputStream in = null;
		try {
			Resource resource = new ClassPathResource(templateFilePath);
			in = resource.getStream();	// 将模板文件转换为文件流
			XLSTransformer transformer = new XLSTransformer();  
			Workbook wb = transformer.transformXLS(new BufferedInputStream(in), dataMap);	// 将excel流转换为Workbook
			Sheet sheet = wb.getSheetAt(0);	// 取第一个sheet
//			sheet.setDefaultColumnWidth(15);
			File fileDir = new File(exportFilePath);
			if(!fileDir.exists()){ // 如果路径不存在，就创建路径
				fileDir.mkdirs();
			}
        	File file = new File(descFilePath);
			FileOutputStream fout;
			fout = new FileOutputStream(file);

			wb.write(fout);
			fout.flush();
			fout.close();  
			System.out.println("已经导出文件至：" + descFilePath);
		} catch (ParsePropertyException e) {
			e.printStackTrace();
		} catch (InvalidFormatException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void exportExcelByTemplate(Map<String, Object> map,String templateFile, String fileName, HttpServletResponse response){
		String templateFilePath = "/template/"+templateFile;
		String descFilePath = "/export/"+fileName;
		/**
		 * 这儿申明的map集合是为了后面transformXLS方法转化需要传入Excel里面的一个Map，
		 * jxls根据Template里面的定义和Map里面的对象对Template进行解析，
		 * 将Map里面的对象值填入到Excel文件中。
		 */
		InputStream in = null;
		try {
			in = new FileInputStream(templateFilePath);	// 将模板文件转换为文件流
			XLSTransformer transformer = new XLSTransformer();  
			Workbook  wb =  transformer.transformXLS(new BufferedInputStream(in), map);	// 将excel流转换为Workbook 
			Sheet sheet = wb.getSheetAt(0);	// 取第一个sheet
//			sheet.setDefaultColumnWidth(15);
			
        	File file = new File(descFilePath);
			FileOutputStream fout;
			fout = new FileOutputStream(file);
			wb.write(fout);  
			fout.flush();
			fout.close();  
			System.out.println("已经导出文件至：" + descFilePath);
		} catch (ParsePropertyException e) {
			e.printStackTrace();
		} catch (InvalidFormatException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	
//	/**
//	 * POI方式导出excel并合并单元格
//	 * @author swb
//	 * @version created at 2017年6月7日 上午9:38:19
//	 * @param dataMap
//	 * @param descFilePath
//	 * @param sheetName
//	 * @throws Exception
//	 */
//	public void exportXlsMerge(Map<String, Object> dataMap, String descFilePath,String sheetName, HttpServletResponse response) throws Exception{
//        HSSFWorkbook wb = new HSSFWorkbook();
//        HSSFSheet sheet = wb.createSheet(sheetName);//创建一个sheet-test1
//        sheet.setColumnWidth((short)0, (short)35.7*260);
//
//        //设置单元格风格，居中对齐.
//        HSSFCellStyle cs = wb.createCellStyle();
//        cs.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//        cs.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
//        cs.setWrapText(true);
//        //设置字体:
//        HSSFFont font = wb.createFont();
//        font.setFontName("宋体");
//        font.setFontHeightInPoints((short) 12);//设置字体大小
//        cs.setFont(font);//要用到的字体格式
//
//        //设置表头第一行样式
//        HSSFCellStyle first_row_style = wb.createCellStyle();
//        first_row_style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//        first_row_style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
//        HSSFFont first_row_font = wb.createFont();
//        first_row_font.setFontName("宋体");
//        first_row_font.setFontHeightInPoints((short) 18);//设置字体大小
//        first_row_style.setFont(first_row_font);//要用到的字体格式
//        //设置表头第二行样式
//        HSSFCellStyle second_row_style = wb.createCellStyle();
//        second_row_style.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
//        second_row_style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
//        HSSFFont second_row_font = wb.createFont();
//        second_row_font.setFontName("宋体");
//        second_row_font.setFontHeightInPoints((short) 14);//设置字体大小
//        second_row_style.setFont(second_row_font);
//
//
//        //创建第一行
//        List<Record> catalogs = (List<Record>) dataMap.get("catalogs");
//        HSSFRow row = sheet.createRow(0);
//        row.setHeightInPoints(23);
//        HSSFCell cell ;
//
//        //第一行，表头
//        row = sheet.createRow(0);
//        row.setHeightInPoints(23);
//        for(int i=0;i<catalogs.size()+1;i++){
//        	cell = row.createCell(i);
//        	cell.setCellStyle(first_row_style);
//        	cell.setCellValue("昆明市交通运输局门户网站信息发布统计表");
//        }
//
//        //第二行，表头
//        row = sheet.createRow(1);
//        row.setHeightInPoints(23);
//        for(int i=0;i<catalogs.size()+1;i++){
//        	cell = row.createCell(i);
//        	cell.setCellStyle(second_row_style);
//        	cell.setCellValue("统计时间："+DateUtils.getChinaeseDateYMD(new Date()));
//        }
//
//        row = sheet.createRow(2);
//        row.setHeightInPoints(23);
//        for (int i = 0; i <= catalogs.size()+1; i++) {//设置表头-标题
//        	if(i == 0){
//        		cell = row.createCell(0);
//                cell.setCellStyle(cs);
//                cell.setCellValue("单位\n部门");
//        	}else if(i >0 && i <= 12){
//        		cell = row.createCell(i);
//        		cell.setCellStyle(cs);
//        		cell.setCellValue("公共栏目");
//        	}else if(i > 12 && i<= 26){
//        		cell = row.createCell(i);
//        		cell.setCellStyle(cs);
//        		cell.setCellValue("部门专栏");
//        	}else{
//        		cell = row.createCell(i);
//        		cell.setCellStyle(cs);
//        		cell.setCellValue("小计");
//        	}
//        }
//
//        //设置合并的标题头(注意：横向合并的时候，标题头单元格必须长度和内容单元格一致否则合并时会把其他标题头单元格内容挤掉)
//        sheet.addMergedRegion(new CellRangeAddress(0,0,0,27));//横向：合并第一行的第2列到第4列
//        sheet.addMergedRegion(new CellRangeAddress(1,1,0,27));//横向：合并第一行的第2列到第4列
//        sheet.addMergedRegion(new CellRangeAddress(2,2,1,12));//横向：合并第一行的第2列到第4列
//        sheet.addMergedRegion(new CellRangeAddress(2,2,13,26));//横向：合并第一行的第2列到第4列
//        sheet.addMergedRegion(new CellRangeAddress(2,3,0,0));//纵向：合并第一列的第1行和第2行第
//        sheet.addMergedRegion(new CellRangeAddress(2,3,catalogs.size()+1,catalogs.size()+1));//纵向：合并最后一列
//
//        //设置对应的合并单元格标题
//        row = sheet.createRow(3);
//        for (int j = 1; j <= catalogs.size(); j++) {
//        	row.setHeightInPoints(70);
//            cell = row.createCell(j);
//            cell.setCellStyle(cs);
//            cell.setCellValue(new HSSFRichTextString(catalogs.get(j-1).getStr("Name")));
//            sheet.setColumnWidth((short)j, (short)35.7*35);
//        }
//
//        //设置列值-内容
//        int sum_total = 0;
//        List<Record> list = (List<Record>) dataMap.get("datas");
//        for (int i = 0; i < list.size(); i++) {
//        	Record data = list.get(i);
//            row = sheet.createRow(i + 4);
//            row.setHeightInPoints(23);
//            int total = 0;
//            cell = row.createCell(0);
//            cs.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//            cell.setCellStyle(cs);
//            cell.setCellValue(data.getStr("userName"));
//            for(int j=0;j<catalogs.size();j++){
//            	String num = "";
//            	List<Record> values = data.get("userValue");
//            	for(int k=0;k<values.size();k++){
//            		if(catalogs.get(j).get("ID").equals(values.get(k).get("CatalogID"))){
//            			num = values.get(k).get("PublishNum")+"";
//            		}
//            	}
//            	if(StrKit.notBlank(num) && Integer.parseInt(num) > 0){
//            		cell = row.createCell(j+1);
//            		cell.setCellStyle(cs);
//            		cell.setCellValue(Integer.parseInt(num));
//            	}else{
//            		row.createCell(j+1).setCellValue("");
//            	}
//            	if(StrKit.notBlank(num) && Integer.parseInt(num) >= 0){
//            		total += Integer.parseInt(num);
//            	}
//            }
//            cell = row.createCell(catalogs.size() + 1);
//            cell.setCellStyle(cs);
//            cell.setCellValue(total);
//            sum_total += total;
//        }
//
//        //最后一行总计
//        row = sheet.createRow(list.size() + 4);
//        row.setHeightInPoints(23);
//        cell = row.createCell(0);
//        cell.setCellStyle(cs);
//        cell.setCellValue("总 计：");
//        for (int i = 1; i <= catalogs.size(); i++) {
//            cell = row.createCell(i);
//            cell.setCellStyle(cs);
//            cell.setCellType(Cell.CELL_TYPE_NUMERIC);
//            cell.setCellValue("");
//        }
//        cell = row.createCell(catalogs.size() + 1);
//        cell.setCellStyle(cs);
//        cell.setCellValue(sum_total);
//
//
//        try {
//            FileOutputStream fileOut = new FileOutputStream(descFilePath);
//            wb.write(fileOut);
//            fileOut.close();
//            System.out.println("导出excel完成！");
//        } catch (Exception e) {
//            System.out.println("文件输出失败!");
//            e.printStackTrace();
//        }
//    }
	
	
	
}
